﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <typesdef.h>
#include "processmodule.h"
#include <disassembleservice.h>
#include <systemservice.h>
#include <driverservice.h>
#include <dialog.h>
#define NOT_EXIST_PROCESS_ID 0XFFFFFFFF

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    void dropEvent(QDropEvent *event);
    void dragEnterEvent(QDragEnterEvent *event);
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


    void timerEvent(QTimerEvent *event);
    bool  eventFilter(QObject *watched, QEvent *event);
private slots:
    void on_TableViewProcessList_clicked(const QModelIndex &index);
    //右键菜单响应槽函数
    void DisplayAssemblyMenu(QPoint pos);
    //转换汇编代码为机器码
    void on_ButtonConvertToMachineCode_clicked();
    //转换机器码为汇编代码
    void on_ButtonConvertToAssemblyCode_clicked();
    //清空汇编,机器码,基址输入框区域文本
    void on_ButtonClearMachineCodeText_clicked();
    //创建远程线程
    void on_ButtonCreateThread_clicked();
    //代码注入
    void on_ButtonInjectCode_clicked();


    void on_ButtonStartDriver_clicked();

    void on_ButtonStopDriver_clicked();


    void on_ButtonSelectDriverFile_clicked();

    void on_ButtonClearLoggerTableView_clicked();

private:
    Ui::MainWindow *ui;
    //汇编窗口右键菜单对象
    QMenu *assemblyQmenu;
    //刷新进程列表
    VOID RefreshProcessListTableView();
    //清空选中进程区域
    VOID ClearSelectPIdArea();
    //设置选中进程区域字段
    VOID SetSelectPIdArea(ULONG dwPId,QString dwPName,QString dwPPath);

    //显示选中进程标签的提示标语
    VOID SetAllPIdTip(QString selectPIdTip);
    //清除选中进程标签的提示标语
    VOID ClearAllPIdTip();

    //定时刷新进程定时器id
    int qTimeId;
    //进程列表数据模型对象
    QStandardItemModel* processTableViewDataModule;
    //进程模块列表数据模型对象
    QStandardItemModel* processModuleTableViewDataModule;
    //进程模块列表数据模型对象
    QStandardItemModel* processThreadTableViewDataModule;
    //反汇编窗口
    QStandardItemModel* AssemblyTableViewDataModule;
    //反汇编窗口
    QStandardItemModel* DriverTableViewDataModule;
    //初始化反汇编窗口
    VOID InitializationAssemblyTable();


    //选中进程时填充进程id,进程名以及图标等信息
    bool SetSelectProcessIconAndInput(const int dwParamPId,PProcessBean pProcessBean,FillSelectPId type);
    //设置进程表格头部数据
    VOID SetTableViewHeader();
    //状态栏回显提示标签指针
    QLabel* qLableStatus;
    //进程管理类对象
    ProcessService  processService;
    //反汇编服务类
    DisassembleService disassembleService;
    //文件服务类
    FileService fileService;
    //系统服务类
    SystemService systemService;
    //刷新线程TableView
    void RefreshProcessThreadListTable(ULONG dwPId);
    //刷新模块TableView
    void RefreshProcessModuleListTable(ULONG dwPId);
    //获取选中的进程详细信息
    bool GetSelectProcessInfo(PProcessBean pProcessBean);
    //获取选中的进程id
    bool  GetSelectPId(PULONG dwPId);
    //填充模块列表信息
    void FillProcessModuleListTable(QList<ProcessModuleBean>qProcessModuleList);
    //获取输入框中的反汇编基址
    ULONG64 GetDisemmblyBaseAddress();


    ULONG ProcessColumnCount;
    ULONG ProcessModuleColumnCount;
    ULONG ProcessThreadColumnCount;
    ULONG AssemblyColumnCount;
    ULONG DriverColumnCount;

    DriverService driverService;

};

#endif // MAINWINDOW_H
